package homework.h02;

import java.util.Arrays;
import java.util.Scanner;

/**
 * @author thinkpad - 83start
 * @version v1.0
 * @create 2022/9/8 13:09
 * @package homework.h02
 * @description 编写一个程序，使用 <h1> 二维数组 <h1/> 存储一年中的每个月的最高温度和最低文帝。该程序输出一年中
 * 中的最高温度的平均值 、 最低温度的平均值，最高温度和最低温度。该程序必须定义以下的方法.
 * 1. getData() 读取数据并将数据存储到二维数组中
 * 2. averageHeight() 计算并返回一年中最高气温的平均值
 * 3. averageLow() 计算并返回一年中最低温度的平均值
 * 4. indexHighTemp() 返回数组中最高温度的索引值
 * 5. indexLowTemp() 返回数组中最低温度的索引值
 */

public class TemperatureImpl implements Temperature {


    @Override
    public double[][] getData() {
        double[][] temps = new double[12][2];

        Scanner scanner = new Scanner(System.in);
        for (int i = 0; i < temps.length; i++) {
            System.out.println(String.format("请输入第 %d 个月的最高温度和最低温度。",i +1));
            double highTemp = scanner.nextDouble();
            double lowTemp = scanner.nextDouble();

            temps[i][0] = highTemp;

            temps[i][1] = lowTemp;
        }
        return temps;
    }

    @Override
    public double averageHeight(double[] heights) {
        double sum = 0;
        for (double height:heights) {
            sum += height;
        }
        return sum /12;
    }

    @Override
    public double averageLow(double[] lows) {
        double sum = 0;
        for (double low:lows) {
            sum += low;
        }
        return sum /12;
    }

    @Override
    public String indexHighTemp(double[][] temperatures) {
        int x = 0 ,y =0 ;
        double max = temperatures[0][0];
        for (int i = 0; i < temperatures.length; i++) {
            for (int j = 0; j < temperatures[i].length; j++) {
                if (temperatures[i][j]> max){
                    max = temperatures[i][j];
                    x = i;
                    y = j;
                }
            }
        }
        return "最大值的索引： x = " + x + ", y = " + y;
    }

    @Override
    public String indexLowTemp(double[][] temperatures) {
        int x = 0 ,y =0 ;
        double min = temperatures[0][0];
        for (int i = 0; i < temperatures.length; i++) {
            for (int j = 0; j < temperatures[i].length; j++) {
                if (temperatures[i][j] < min){
                    min = temperatures[i][j];
                    x = i;
                    y = j;
                }
            }
        }
        return "最小值的索引： x = " + x + ", y = " + y;
    }

    public static void main(String[] args) {
        TemperatureImpl temperature = new TemperatureImpl();
//        double[][] temps = new double[2][12];
        // 初始化数组
//        double[][] temps = {
//                {34.3, 32.4},
//                {34.6, 25.4},
//                {12.5, 6.7},
//                {12.6, 3.5},
//                {7.4, -5.3},
//                {24.3, 12.4},
//                {14.6, 15.4},
//                {42.5, 26.7},
//                {32.6, 6.5},
//                {9.4, -7.3},
//                {2.4, -6.3},
//                {26.4, -16.3}};

        double[][] temps = temperature.getData();

        // 获取最高温度的数组 和 最低温度的数组
        double[] highTemps = new double[12];
        double[] lowTemps = new double[12];

        for (int i = 0; i < highTemps.length ; i++) {
            highTemps[i] = temps[i][0];
            lowTemps[i] = temps[i][1];
        }

        System.out.println("最高温度集合：" + Arrays.toString(highTemps));
        System.out.println("最低温度集合：" + Arrays.toString(lowTemps));



        // 获取最大值的平均值
        double averageHeight = temperature.averageHeight(highTemps);
        System.out.println("最大值的平均值为：" + averageHeight);

        // 获取最小值的平均值
        double averageLow = temperature.averageLow(lowTemps);
        System.out.println("最小值的平均值为：" +averageLow);

        // 求最大值的索引
        String indexHighTemp = temperature.indexHighTemp(temps);
        System.out.println("最大值的索引为：" + indexHighTemp);

        // 最小值的索引
        String indexLowTemp = temperature.indexLowTemp(temps);
        System.out.println("最小值的索引为：" + indexLowTemp);

    }
}

interface Temperature {
    /**
     * 读取数据，并将数据存储到二维数组中
     *
     * @return 返回温度维数组
     */
    public abstract double[][] getData();

    /**
     * 返回一年中最高温度的平均值
     *
     * @param heights 最高温度的集合
     * @return
     */
    public abstract double averageHeight(double[] heights);

    /**
     * 返回一年中最低温度的集合
     *
     * @param lows
     * @return
     */
    public abstract double averageLow(double[] lows);

    /**
     * 返回一年中最高温度的索引
     *
     * @param temperatures
     * @return
     */
    public abstract String indexHighTemp(double[][] temperatures);


    /**
     * 返回一年中最低温度的索引
     *
     * @param temperatures
     * @return
     */
    public abstract String indexLowTemp(double[][] temperatures);


}
